/*
 * PositionMapper.java
 * 
 *  author: Daniel Rudigier
 *    date: 05.06.2008
 * 
 * 
 */
package ocumed.persistenz.mapper;

import java.util.Calendar;
import java.util.List;

import ocumed.persistenz.dao.BehandlungDAO;
import ocumed.persistenz.dao.DAOFactory;
import ocumed.persistenz.dao.LeistungDAO;
import ocumed.persistenz.dao.PositionDAO;
import ocumed.persistenz.hibernate.OcBehandlung;
import ocumed.persistenz.hibernate.OcLeistung;
import ocumed.persistenz.hibernate.OcPosition;
import ocumed.teams.IPosition;

/**
 * @author Daniel Rudigier
 *
 */
public class PositionMapper extends PersistenceMapper {

    /**
     * override
     *
     * @see ocumed.persistenz.mapper.PersistenceMapper#delete(java.lang.Object)
     */
    @Override
    public void delete(Object instance) {
        PositionDAO pDAO = DAOFactory.get(DAOFactory.RDBMS).getPositionDAO();
        pDAO.start();

        IPosition i = (IPosition) instance;
        OcPosition r = pDAO.findById(i.getPositionid());

        pDAO.delete(r);
        pDAO.commit();
    }

    /**
     * override
     *
     * @see ocumed.persistenz.mapper.PersistenceMapper#get(int)
     */
    @Override
    public Object get(int id) {
        PositionDAO pDAO = DAOFactory.get(DAOFactory.RDBMS).getPositionDAO();
        pDAO.start();
        return pDAO.findById(id);
    }

    /**
     * override
     *
     * @see ocumed.persistenz.mapper.PersistenceMapper#getAll()
     */
    @Override
    public List getAll() {
        PositionDAO pDAO = DAOFactory.get(DAOFactory.RDBMS).getPositionDAO();
        pDAO.start();
        return pDAO.findAll();
    }

    /**
     * override
     *
     * @see ocumed.persistenz.mapper.PersistenceMapper#put(java.lang.Object)
     */
    @Override
    public void put(Object instance) {
        PositionDAO pDAO = DAOFactory.get(DAOFactory.RDBMS).getPositionDAO();
        pDAO.start();

        IPosition i = (IPosition) instance;
        OcPosition r = pDAO.findById(i.getPositionid());

        if (r != null) {
            updatePosition(r, i);
            pDAO.attachDirty(r);
        } else {
            r = new OcPosition();
            updatePosition(r, i);
            Integer id = pDAO.persist(r);
            r.setPositionid(id);
        }

        pDAO.commit();
    }

    /**
     * @param r
     * @param i
     */
    private void updatePosition(OcPosition r, IPosition i) {
        BehandlungDAO bDAO = DAOFactory.get(DAOFactory.RDBMS).getBehandlungDAO();
        LeistungDAO lDAO = DAOFactory.get(DAOFactory.RDBMS).getLeistungDAO();
        bDAO.start();
        lDAO.start();
        
        OcBehandlung b = i.getiBehandlung() != null ? bDAO.findById(i.getiBehandlung().getBehandlungid()) : null;
        OcLeistung l = i.getiLeistung() != null ? lDAO.findById(i.getiLeistung().getLeistungid()) : null;
        
        r.setPositionid(i.getPositionid());
        r.setOcBehandlung(b);
        r.setOcLeistung(l);
        char b1 = i.getPositionBestimmtFraktrometer() ? PositionDAO.bestimmtFraktrometer : PositionDAO.bestimmtKeinFraktrometer;
        r.setPositionbestimmtfraktrometer(b1);
        char b2 = i.getPositionBestimmtPhoropter() ? PositionDAO.bestimmtPhoropter : PositionDAO.bestimmtKeinPhoropter;
        r.setPositionbestimmtphoropter(b2);
        char b3 = i.getPositionBestimmtSchatten() ? PositionDAO.bestimmtSchatten : PositionDAO.bestimmtKeinenSchatten;
        r.setPositionbestimmtschatten(b3);
        r.setPositionfehll(i.getPositionFehlL());
        r.setPositionfehlr(i.getPositionFehlR());
        r.setPositionsehtestl(i.getPositionSehtestL());
        r.setPositionsehtestr(i.getPositionSehtestR());
        r.setPositiontext(i.getPositiontext());
        r.setPositiontyp(i.getPositionTyp());
        
        Calendar datum = Calendar.getInstance();
        datum.setTime((i.getPositionDatum()));
        
        r.setPositiondatum(datum);
    }

}
